home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks96
/
FlyPaper.sit
/
Fly Paper
/
FlyPaper Source
/
New Sources
/
ClippingFile.cpp
next >
Wrap
Text File
|
1996-06-22
|
7KB
|
332 lines
#ifndef CLIPPINGFILE_H
#include "ClippingFile.h"
#endif
#ifndef ST_MACCLASSES_H
#include "ST_MacClasses.h"
#endif
#ifndef CLIPPINGFILEDATA_H
#include "ClippingFileData.h"
#endif
#ifndef FLYPAPERUTILS_H
#include "FlyPaperUtils.h"
#endif
#ifndef FLYPAPERDRAGUTILS_H
#include "FlyPaperDragUtils.h"
#endif
CClippingFile::CClippingFile (FSSpec& fileOnDisk) :
fRefNum (0),
fClippingTOC (0),
fData (0)
{
ST_ResFileSaver saver = CurResFile ();
ST_ResFileCloser ref = FSpOpenResFile (&fileOnDisk, fsRdWrPerm);
if ((short) ref < 0)
throw ResError ();
fRefNum = (short) ref;
InitCClippingFile ();
ref.Forget ();
}
CClippingFile::CClippingFile (short refNum) :
fRefNum (refNum),
fClippingTOC (0),
fData (0)
{
ST_ResFileSaver saver = CurResFile ();
UseResFile (refNum);
InitCClippingFile ();
}
CClippingFile* CClippingFile::NewClippingFileFromDragItem (DragReference dragRef,
ItemReference itemRef, Point dropPoint, short tile)
{
FSSpec spec;
OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true,
&spec.vRefNum, &spec.parID);
if (error)
throw error;
NumToString (TickCount (), spec.name);
CClippingFile* file = nil;
unsigned short howManyFlavors;
error = CountDragItemFlavors (dragRef, itemRef, &howManyFlavors);
if (error)
throw error;
for (unsigned short whichFlavor = 1; whichFlavor <= howManyFlavors; ++whichFlavor) {
if (AcceptableFlavor (dragRef, itemRef, whichFlavor)) {
if (file == nil) {
file = NewClippingFile (spec);
}
FlavorType type;
FlavorFlags flags;
Size size;
error = GetFlavorType (dragRef, itemRef, whichFlavor, &type);
if (error)
throw error;
error = GetFlavorFlags (dragRef, itemRef, type, &flags);
if (error)
throw error;
error = GetFlavorDataSize (dragRef, itemRef, type, &size);
if (error)
throw error;
/* allocate memory for the drag item */
Handle data = TempNewHandle (size, &error);
if (!data) {
throw error;
}
ST_Handle dataKiller (data);
{
ST_HandleStateSaver dataStateSaver (data);
HLock (data);
error = GetFlavorData (dragRef, itemRef, type, *data, &size, 0);
if (error)
throw error;
}
file -> AddFlavor (type, data);
WriteResource (data);
ReleaseResource (data);
dataKiller.Forget ();
}
}
if (file) {
CClippingFileData* data = file -> GetData ();
if (!data)
throw memFullErr;
short offset;
Boolean onLeft;
ClassifyPoint (dropPoint, &onLeft, &offset);
data -> SetOnLeft (onLeft);
data -> SetOffset (offset);
}
return file;
}
void CClippingFile::InitCClippingFile ()
{
ST_ResourceHandle toc = Get1Resource (kClippingTOCResType, kClippingTOCResID);
if (!(Handle) toc)
throw resNotFound;
fData = new CClippingFileData (fRefNum);
fClippingTOC = (ClippingTOCHandle)(Handle) toc;
toc.Forget ();
}
CClippingFile::~CClippingFile ()
{
delete fData;
CloseResFile (fRefNum);
}
CClippingFile* CClippingFile::NewClippingFile (FSSpec& fileLocation, OSType primaryFlavor)
{
OSType fileCreator, fileType;
switch (primaryFlavor) {
case 'TEXT' :
fileType = kTextClippingType;
fileCreator = kFinderClippingSignature;
break;
case 'snd ' :
fileType = kSoundClippingType;
fileCreator = kFinderClippingSignature;
break;
case 'PICT' :
fileType = kPictureClippingType;
fileCreator = kFinderClippingSignature;
break;
default :
fileType = kMyClippingType;
fileCreator = kMyClippingSignature;
}
ST_ResFileSaver saver = CurResFile ();
FSpCreateResFile (&fileLocation, fileCreator, fileType, smRoman);
ST_ResFileCloser ref = FSpOpenResFile (&fileLocation, fsRdWrPerm);
if ((short) ref < 0)
throw ResError ();
// Create an empty table of contents
ClippingTOCHandle tocHandle = (ClippingTOCHandle)
NewHandleClear (sizeof (ClippingTOCRec));
if (!tocHandle)
throw ResError ();
(**tocHandle).version = 1;
// Add it to the new clipping file
AddResource ((Handle) tocHandle, kClippingTOCResType, kClippingTOCResID, "\p");
OSErr error = ResError ();
if (error) {
DisposeHandle ((Handle) tocHandle);
throw error;
}
ST_ResourceHandle tocHandleKiller = (Handle)tocHandle;
CClippingFileData::CreateNewClippingFileData (ref);
WriteResource ((Handle) tocHandle);
tocHandleKiller.Forget ();
short resFileRefNum = ref;
ref.Forget ();
return new CClippingFile (resFileRefNum);
}
void CClippingFile::AddFlavor (const FlavorType flavorType, const Handle flavorData)
{
ST_ResFileSaver saver = CurResFile ();
UseResFile (fRefNum);
Handle flavorRes = Get1Resource (flavorType, kFlavorResID);
if (flavorRes) {
RemoveResource (flavorRes);
DisposeHandle (flavorRes);
UpdateResFile (fRefNum);
}
AddResource (flavorData, flavorType, kFlavorResID, "\p");
OSErr error = ResError ();
if (error)
throw error;
ClippingFlavorRec flavorRec;
flavorRec.flavorType = flavorType;
flavorRec.reserved3 = flavorRec.reserved2 = flavorRec.reserved1 = 0;
error = PtrAndHand (&flavorRec, (Handle) fClippingTOC, sizeof (flavorRec));
if (error)
throw error;
++(**fClippingTOC).flavorCount;
ChangedResource ((Handle) fClippingTOC);
}
short CClippingFile::CountFlavors ()
{
return (**fClippingTOC).flavorCount;
}
void CClippingFile::GetIndFlavor (short index, FlavorType& gotFlavor, Handle& gotHandle)
{
ClippingTOCRec* clippingTOC = *fClippingTOC;
if (index > clippingTOC -> flavorCount)
throw paramErr;
FlavorType flavorType = clippingTOC -> flavors [index - 1].flavorType;
ST_ResFileSaver saver = CurResFile ();
UseResFile (fRefNum);
Handle flavorData = Get1Resource (flavorType, kFlavorResID);
if (!flavorData)
throw resNotFound;
gotFlavor = flavorType;
gotHandle = flavorData;
}
void CClippingFile::GetIndFlavorType (short index, FlavorType& gotFlavor)
{
ClippingTOCRec* clippingTOC = *fClippingTOC;
if (index > clippingTOC -> flavorCount)
throw paramErr;
gotFlavor = clippingTOC -> flavors [index - 1].flavorType;
}
DragReference CClippingFile::BuildDragReference ()
{
ST_ResFileSaver saver = CurResFile ();
DragReference dragRef;
OSErr error = NewDrag (&dragRef);
if (error)
throw error;
ST_DragReference dragReferenceKiller = dragRef;
short flavorCount = CountFlavors ();
for (short i = 1; i <= flavorCount; ++i) {
FlavorType flavorType;
Handle flavorHandle;
GetIndFlavor (i, flavorType, flavorHandle);
HLock (flavorHandle);
error = AddDragItemFlavor (dragRef, (ItemReference) 0, flavorType, *flavorHandle,
GetHandleSize (flavorHandle), 0);
ReleaseResource (flavorHandle);
if (error)
throw error;
}
dragReferenceKiller.Forget ();
return dragRef;
}
void CClippingFile::AddThumbnail (CThumbnail& thumbnail)
{
}
CThumbnail* CClippingFile::GetThumbnail ()
{
return nil;
}
Boolean CClippingFile::GetFSSpec (FSSpec& spec)
{
FCBPBRec pb;
pb.ioVRefNum = 0;
pb.ioFCBIndx = 0;
pb.ioRefNum = fRefNum;
pb.ioNamePtr = spec.name;
spec.name [0] = '\0';
OSErr error = PBGetFCBInfoSync (&pb);
if (error)
return false;
spec.vRefNum = pb.ioFCBVRefNum;
spec.parID = pb.ioFCBParID;
return true;
}